/*
 * Copyright (C), 2002-2016, 你的兔宝宝电子商务有限公司
 * FileName: Numbers.java
 * Author:   你的兔宝宝
 * Date:     2016-9-19 上午10:15:43
 * Description: 数字工具类//模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.baby.demo.utils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

/**
 * 数字工具类<br> 
 * 〈功能详细描述〉
 *
 * @author 你的兔宝宝
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class Numbers {
    
    
    @SuppressWarnings("rawtypes")
    private static final Map<String,NumberParser> numbers = new HashMap<String,NumberParser>();
    
    static{
        //Short
        NumberParser<Short> shortParser = new NumberParser<Short>(){
            @Override
            public Short parse(String value) {
                return Short.parseShort(value);
            }
        };
        numbers.put("short", shortParser);
        numbers.put("java.lang.Short", shortParser);
        //Integer
        NumberParser<Integer> integerParser = new NumberParser<Integer>(){
            @Override
            public Integer parse(String value) {
                return Integer.parseInt(value);
            }
        };
        numbers.put("integer", integerParser);
        numbers.put("int", integerParser);
        numbers.put("java.lang.Integer", integerParser);
        //Long
        NumberParser<Long> longParser = new NumberParser<Long>(){
            @Override
            public Long parse(String value) {
                return Long.parseLong(value);
            }
        };
        numbers.put("long", longParser);
        numbers.put("java.lang.Long", longParser);
        //Float
        NumberParser<Float> floatParser = new NumberParser<Float>(){
            @Override
            public Float parse(String value) {
                return Float.parseFloat(value);
            }
        };
        numbers.put("float", floatParser);
        numbers.put("java.lang.Float", floatParser);
        //Double
        NumberParser<Double> doubleParser = new NumberParser<Double>(){
            @Override
            public Double parse(String value) {
                return Double.parseDouble(value);
            }
        };
        numbers.put("double", doubleParser);
        numbers.put("java.lang.Double", doubleParser);
        //BigInteger
        NumberParser<BigInteger> bigIntegerParser = new NumberParser<BigInteger>(){
            @Override
            public BigInteger parse(String value) {
                return new BigInteger(value);
            }
        };
        numbers.put("bigInteger", bigIntegerParser);
        numbers.put("java.math.BigInteger", bigIntegerParser);
        //BigDecimal
        NumberParser<BigDecimal> bigDecimalParser = new NumberParser<BigDecimal>(){
            @Override
            public BigDecimal parse(String value) {
                return new BigDecimal(value);
            }
        };
        numbers.put("bigDecimal", bigDecimalParser);
        numbers.put("java.math.BigDecimal", bigDecimalParser);
    }
    
    private Numbers() {
        // noop
    }
    
    /**
     * 
     * 〈string转换数字〉<br> 
     * 〈功能详细描述〉
     *
     * @author 你的兔宝宝
     * @see [相关类/方法]（可选）
     * @since [产品/模块版本] （可选）
     */
    public static abstract class NumberParser<T>{
        public abstract T parse(String value);
    }
    
    /**
     * 
     * 功能描述: 将string类型转为数字类型<br>
     * 〈功能详细描述〉
     *
     * @param type 1.Short、2.Integer、3.Long、4.Float、5.Double、6.BigInteger、7.BigDecimal
     * @param value
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> T parse(Class type,Object value){
        NumberParser<T> parser = numbers.get(type.getCanonicalName());
        return parser.parse(Strings.show(value));
    }
    
    
    
    /**
     * 
     * 功能描述: 将string类型转为数字类型<br>
     * 〈功能详细描述〉
     *
     * @param type  1.short、2.integer/int、3.long、4.float、5.double、6.bigInteger、7.bigDecimal
     * @param value
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    @SuppressWarnings("unchecked")
    public static <T> T parse(String type,Object value){
        NumberParser<T> parser = numbers.get(type);
        return parser.parse(Strings.show(value));
    }
    
    /**
     * 
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param def   1.Short、2.Integer、3.Long、4.Float、5.Double、6.BigInteger、7.BigDecimal
     * @param value
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    @SuppressWarnings("unchecked")
    public static <T> T parse(T def,Object value){
        NumberParser<T> parser = numbers.get(def.getClass().getCanonicalName());
        T ovalue = null;
        if( parser != null ){
            ovalue = parser.parse(Strings.show(value));
        }
        if( ovalue == null ){
            ovalue = def;
        }
        return ovalue;
    }
    
}
